﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ECOSYSTEM_BL;
using ECOSYSTEM_Dominio;
using System.IO;
namespace ECOSYSTEMPRESENTACION
{
    public partial class frmProducto : Form
    {
        public frmProducto()
        {
            InitializeComponent();
        }
        Producto elProducto = new Producto();
        ProductoBL elproductoBL = new ProductoBL();
        MarcaBL laMarcaBL = new MarcaBL();
        SubLineaBL laSubLineaBL = new SubLineaBL();
        AlmacenBL elAlmacenBl = new AlmacenBL();
        Almacen elAlmacen = new Almacen();
        Int32 CodProdID;
        private Producto ObtenerObjetoGuardar()
        {
            elProducto.Nombre = txtNameProd.Text;
            elProducto.StockMin = Convert.ToDouble(txtStockMinProd.Text); 
            MemoryStream ms = new MemoryStream();
            if (pbProducto.Image != null)
            {
                this.pbProducto.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] image = ms.GetBuffer();
                elProducto.Imagen = image;
            }
            else
            {
                this.pbProducto.InitialImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] image = ms.GetBuffer();
                elProducto.Imagen = image;
            }
            elProducto.Tipo = "Producto";
            elProducto.Descripcion = "";
            elProducto.LaMarca = guardarMarca();
            elProducto.LaSubLinea = guardarSublinea();
            return elProducto;
        }
        private Int32 guardarMarca() {
            Int32 IDM;
            if (cmbMarcaProd.SelectedValue == null)
            {
                IDM = laMarcaBL.NuevaMarcaCod(cmbMarcaProd.Text.ToString().ToUpper(), "SIN DESCRIPCION");
            }
            else
            {
               IDM = Convert.ToInt32(cmbMarcaProd.SelectedValue);
            }
            return IDM;
        }
        private Int32 guardarSublinea() {
            Int32 IDSL;
            if (cmbSubLineaProd.SelectedValue == null)
            {
                IDSL = laSubLineaBL.NuevaSubLineaCod(cmbSubLineaProd.Text.ToString().ToUpper(), "SIN DESCRIPCION");
            }
            else
            {
                IDSL = Convert.ToInt32(cmbSubLineaProd.SelectedValue);
            }
            return IDSL;
        }
        private Boolean GuardarProducto()
        {
            Producto elProducto = ObtenerObjetoGuardar();
            CodProdID = elproductoBL.guardarProducto(elProducto);
            RegistrarProductoAlmacen(CodProdID);
            return true;
        }
        private void RegistrarProductoAlmacen( Int32 ProductoIDCod) {
            elAlmacen.ElProducto = ProductoIDCod;
            elAlmacen.CantidadProdIngresa = 0;
            elAlmacen.PrecioVenta = 0.0;
            elAlmacenBl.guardarProductoAlmacen(elAlmacen);
        }
        private Producto ObtenerObjetoActualizar()
        {
            elProducto.ProductoID = Convert.ToInt32(lblCodProd.Text);
            elProducto.StockMin = Convert.ToDouble(txtStockMinProd.Text);
            elProducto.Nombre = txtNameProd.Text;
            MemoryStream ms = new MemoryStream();
            this.pbProducto.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] image = ms.GetBuffer();
            elProducto.Imagen = image;
            elProducto.Tipo = "Producto";
            elProducto.Descripcion = "";
            elProducto.LaMarca = guardarMarca();
            elProducto.LaSubLinea = guardarSublinea();
            return elProducto;
        }
        private Boolean ActualizarProducto()
        {
            Producto elProducto = ObtenerObjetoActualizar();
            elproductoBL.ActualizarProducto(elProducto);
            return true;
        }
        private void LlenarMarca()
        {
            if (cmbMarcaProd.DataSource == null)
            {
                cmbMarcaProd.DataSource = laMarcaBL.ObtenerMarca();
                cmbMarcaProd.DisplayMember = "Marca";
                cmbMarcaProd.ValueMember = "Codigo";
            }
        }
        private void LlenarSubLinea()
        {
            if (cmbSubLineaProd.DataSource == null)
            {
                cmbSubLineaProd.DataSource = laSubLineaBL.ObtenerSubLinea();
                cmbSubLineaProd.DisplayMember = "SubLinea";
                cmbSubLineaProd.ValueMember = "Codigo";
            }
        }
        private void LlenarFiltroSubLinea()
        {
            if (cmbFiltroSubLinea.DataSource == null)
            {
                cmbFiltroSubLinea.DataSource = laSubLineaBL.ObtenerSubLinea();
                cmbFiltroSubLinea.DisplayMember = "SubLinea";
                cmbFiltroSubLinea.ValueMember = "Codigo";               
            }
        }
        private void LlenarDatosProducto()
        {
            if (dgvListaProductos.DataSource == null)
            {
                dgvListaProductos.DataSource = elproductoBL.ObtenerListaProductos(Convert.ToInt32(cmbFiltroSubLinea.SelectedValue), -1);
            }
        }
        private void ObtenerImagen(Int32 CodigoProducto) {
            try
            {
                    List<Producto> lista;
                    lista = elproductoBL.ObtenerImagenProducto(CodigoProducto);
                    foreach (Producto filas in lista)
                    {
                        Byte[] data = (Byte[])(filas.Imagen);
                        Stream ima = new MemoryStream(data);
                        this.pbProducto.Image = Image.FromStream(ima);
                    }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        //--> EVENTOS <--

        private void pbProducto_Click(object sender, EventArgs e)
        {
            Image ImgProducto, auxImagen;
            OpenFileDialog abrirImage = new OpenFileDialog();
            abrirImage.Title = "Seleccionar Imagen";
            abrirImage.Filter = "Formato JPG|*.jpg";
            try
            {
                if (abrirImage.ShowDialog() == DialogResult.OK)
                {
                    pbProducto.BackgroundImage = null;
                    ImgProducto = Image.FromFile(abrirImage.FileName);
                    auxImagen = (Image)ImgProducto.Clone();
                    this.pbProducto.Image = auxImagen;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Archivo Imposible de Abrir" + ex.Message);
            }
        }
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                btnNuevo.Enabled = true;
                btnBuscar.Enabled = true;
                btnNewProd.Enabled = false;
                btnUpdateProd.Enabled = false;
                btnCancelar.Enabled = false;
                LimpiarCampos();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void btnNewProd_Click(object sender, EventArgs e)
        {
            try
            {
                GuardarProducto();
                MessageBox.Show("Modelo :  " + txtNameProd.Text + "\n REGISTRADO CORRECTAMENTE ");
                LimpiarCampos();
                txtNameProd.Select();
                DesconectarCombos();
                LlenarCombos();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }            
        }
        private void DesconectarCombos()
        {
            cmbMarcaProd.DataSource = null;
            cmbSubLineaProd.DataSource = null;
        }
        private void AplicarFiltro()
        {
            int ret = filtrar_dgvListaProducto("Modelo", txtSearchProd.Text.Trim(), filtrador, dgvListaProductos);
            if (ret == 0)
            {
                txtSearchProd.BackColor = Color.Red;
            }
            else
            {
                txtSearchProd.BackColor = Color.White;
            }
        }
        private int filtrar_dgvListaProducto(String Columna, String texto, BindingSource Binding, DataGridView data)
        {
            if (filtrador.DataSource == null) { return 0; }
            try
            {
                String filtro = String.Empty;
                filtro = "LIKE '" + texto.Trim() + "%'";
                if (filtro != String.Empty)
                {
                    filtro = "[" + Columna + "]" + filtro;
                }
                Binding.Filter = filtro;
                data.DataSource = Binding.DataSource;
                return Binding.Count;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return 0;
        }
        private void LimpiarCampos()
        {
            txtNameProd.Text = "";
            txtSearchProd.Text = "";
            txtStockMinProd.Text = "2";
            pbProducto.Image = null;
            groupBox3.Enabled = false;
            groupBox2.Enabled = false;
            btnNuevo.Enabled = true;
            btnBuscar.Enabled = true;            
            btnNewProd.Enabled = false;
            btnUpdateProd.Enabled = false;
            btnCancelar.Enabled = false;
            cmbFiltroSubLinea.DataSource = null;
            dgvListaProductos.DataSource = null;
            cmbSubLineaProd.DataSource = null;
            cmbMarcaProd.DataSource = null;
        }
        private void LlenarCombos() {
            LlenarSubLinea();
            LlenarMarca();
        }
        private void cmbFiltroSubLinea_SelectionChangeCommitted(object sender, EventArgs e)
        {
            dgvListaProductos.DataSource = null;
            filtrador.DataSource = elproductoBL.ObtenerListaProductos(Convert.ToInt32(cmbFiltroSubLinea.SelectedValue), -1);
            LlenarDatosProducto();
        }

        private void cmbFiltroSubLinea_KeyUp(object sender, KeyEventArgs e)
        {
            dgvListaProductos.DataSource = null;
            filtrador.DataSource = elproductoBL.ObtenerListaProductos(Convert.ToInt32(cmbFiltroSubLinea.SelectedValue), -1);
            LlenarDatosProducto();
        }

        private void btnUpdateProd_Click(object sender, EventArgs e)
        {
            try
            {
                ActualizarProducto();
                MessageBox.Show("Producto : " + txtNameProd.Text + " Actualizado\n    CORRECTAMENTE");
                DesconectarCombos();
                LlenarCombos();
                LimpiarCampos();                
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void dgvListaProductos_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                int nrofila = Int32.Parse(e.RowIndex.ToString());
                LlenarSubLinea();
                LlenarMarca();
                groupBox2.Enabled = true;
                this.lblCodProd.Text = Convert.ToString(dgvListaProductos["Codigo", nrofila].Value);
                this.txtNameProd.Text = Convert.ToString(dgvListaProductos["Modelo", nrofila].Value);
                this.txtStockMinProd.Text = Convert.ToString(dgvListaProductos["StockMin", nrofila].Value);
                this.cmbSubLineaProd.SelectedValue = dgvListaProductos["SubLineaID",nrofila].Value;
                this.cmbMarcaProd.SelectedValue = dgvListaProductos["MarcaID", nrofila].Value;
                ObtenerImagen(Convert.ToInt32(dgvListaProductos["Codigo", nrofila].Value));
                txtNameProd.Select();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void txtSearchProd_TextChanged(object sender, EventArgs e)
        {
            AplicarFiltro();
        }
        private void HabilitarNuevo() {
            groupBox2.Enabled = true;
            btnNewProd.Enabled = true;
            btnBuscar.Enabled = false;
            LlenarCombos();
            cmbFiltroSubLinea.DataSource = null;
            dgvListaProductos.DataSource = null;
            txtNameProd.Select();
            btnNuevo.Enabled = false;
            btnCancelar.Enabled = true;
        }
        private void buscarProducto() {
            groupBox3.Enabled = true;
            btnUpdateProd.Enabled = true;
            btnNuevo.Enabled = false;
            btnCancelar.Enabled = true;
            btnBuscar.Enabled = false;
            LlenarFiltroSubLinea();
            cmbFiltroSubLinea.Text = "";
            cmbFiltroSubLinea.Select();
        }
        private void btnNuevo_Click(object sender, EventArgs e)
        {
            HabilitarNuevo();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                buscarProducto();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }      

    }
}
